home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Belgian Amiga Club - ADF Collection
/
BS1 part 34.zip
/
BS1 part 34
/
FredFish PD 302.adf
/
ProgUtils
/
Trace.asm
< prev
next >
Wrap
Assembly Source File
|
1990-01-15
|
6KB
|
320 lines
opt c+,l-
incdir include/
include intuition/intuitionbase.i
include intuition/intuition.i
;******************************
;* Trace Open and LoadSeg *
;* © J.Tyberghein 29 sep 89 *
;******************************
SysBase equ 4
;ExecBase routines
_LVOOldOpenLibrary equ -408
_LVOCloseLibrary equ -414
_LVOForbid equ -132
_LVOPermit equ -138
_LVOWaitPort equ -384
_LVOGetMsg equ -372
_LVOReplyMsg equ -378
;DosBase routines
_LVOOpen equ -30
_LVOOutput equ -60
_LVOWrite equ -48
_LVOLoadSeg equ -150
;IntuitionBase routines
_LVOOpenWindow equ -204
_LVOCloseWindow equ -72
_LVOSetWindowTitles equ -276
;Graphics routines
_LVOText equ -60
_LVOMove equ -240
_LVOScrollRaster equ -396
_LVOSetAPen equ -342
CALLEXEC macro
move.l (SysBase).w,a6
jsr _LVO\1(a6)
endm
CALLGRAF macro
move.l GfxBase,a6
jsr _LVO\1(a6)
endm
CALLINT macro
move.l IntBase,a6
jsr _LVO\1(a6)
endm
CALLDOS macro
move.l DosBase,a6
jsr _LVO\1(a6)
endm
;*** Start code ***
move.l a0,ComLin
move.l d0,ComLinLen
;DosLibrary
lea DosLib,a1
CALLEXEC OldOpenLibrary
move.l d0,DosBase
;IntuitionLibrary
lea IntLib,a1
CALLEXEC OldOpenLibrary
move.l d0,IntBase
;GfxLibrary
lea GfxLib,a1
CALLEXEC OldOpenLibrary
move.l d0,GfxBase
;Get current OutputHandle
CALLDOS Output
move.l d0,OutputHandle
;Check arguments
move.b #0,SmallWin
lea NWin,a0
move.w #300,nw_Width(a0)
cmp.l #3,ComLinLen
blt.s NoSmallWin
move.w #350,nw_Width(a0)
move.l ComLin,a0
cmp.b #'s',2(a0)
bne.s ErrorArg
move.b #1,SmallWin
lea NWin,a0
move.w #10,nw_Height(a0)
move.l #0,nw_FirstGadget(a0)
NoSmallWin:
move.l ComLin,a0
cmp.b #'o',(a0)
beq.s OpenTrace
cmp.b #'l',(a0)
beq.s LoadSegTrace
ErrorArg:
move.l OutputHandle,d1
move.l #UsageString,d2
move.l #UsageStringLen,d3
CALLDOS Write
bra ErrorOW
OpenTrace:
move.l #_LVOOpen,Offset
move.l #WoTitle,WinTitle
move.l #-1,DosNum
bra.s Continue
LoadSegTrace:
move.l #_LVOLoadSeg,Offset
move.l #WlTitle,WinTitle
move.l #-19,DosNum
Continue:
tst.b SmallWin
beq.s NoSmW
move.l #0,WinTitle
NoSmW:
bsr OpenWin
tst.l d0
beq ErrorOW
;Install Patch
CALLEXEC Forbid
move.l DosBase,a0
move.l Offset,d0
move.w (a0,d0),SaveSetF
move.l 2(a0,d0),SaveSetF+2
move.w #$4ef9,(a0,d0)
move.l #Patch,2(a0,d0)
move.l DosBase,d0
add.l #$4e,d0
move.l d0,LabelJmp+2
CALLEXEC Permit
;Wait for windowclose or gadget
WaitUser:
move.l UserPort,a0
CALLEXEC WaitPort
move.l UserPort,a0
CALLEXEC GetMsg
move.l d0,a0
move.l im_Class(a0),d2
move.w im_Code(a0),d3
move.l a0,a1
CALLEXEC ReplyMsg
and.l #MOUSEBUTTONS,d2
beq.s TheEnd
cmp.w #MENUUP,d3
bne.s WaitUser
;The user pressed the right mouse button, so move the window to the first screen
move.l Win,a0
CALLINT CloseWindow
bsr OpenWin
tst.l d0
bne.s WaitUser
bsr EndPatch
bra.s ErrorOW
TheEnd:
bsr EndPatch
move.l Win,a0
CALLINT CloseWindow
ErrorOW:
move.l GfxBase,a1
CALLEXEC CloseLibrary
move.l DosBase,a1
CALLEXEC CloseLibrary
move.l IntBase,a1
CALLEXEC CloseLibrary
rts
;*** Restore patch ***
EndPatch:
CALLEXEC Forbid
move.l DosBase,a0
move.l Offset,d0
move.w SaveSetF,(a0,d0)
move.l SaveSetF+2,2(a0,d0)
CALLEXEC Permit
rts
;*** Open window on first screen ***
;-> d0 = 0 if error
;***
OpenWin:
move.l IntBase,a1
lea NWin,a0
move.l ib_FirstScreen(a1),nw_Screen(a0)
move.l WinTitle,nw_Title(a0)
CALLINT OpenWindow
tst.l d0
beq.s ErrorOWi
move.l d0,Win
move.l d0,a0
move.l wd_RPort(a0),rp
move.l wd_UserPort(a0),UserPort
moveq #1,d0
ErrorOWi:
rts
;*** New patch function ***
;Print file name
;***
Patch:
movem.l a6/d1-d5,-(a7)
tst.b SmallWin
bne.s SkipDraw
move.l d1,-(a7) ;We have a large window
move.l rp,a1
moveq #0,d0
moveq #10,d1
moveq #2,d2
moveq #12,d3
move.l #286,d4
move.l #51,d5
CALLGRAF ScrollRaster ;Scroll window one line up
move.l rp,a1
moveq #1,d0 ;White
CALLGRAF SetAPen
move.l rp,a1
moveq #10,d0
moveq #0,d1
move.w #50,d1
CALLGRAF Move
move.l (a7)+,d1 ;Restore string ptr (argument in d1)
move.l rp,a1
move.l d1,a0
bsr StrLen
cmp.l #34,d0
ble.s AllRight
moveq #34,d0
AllRight:
move.l d1,a0
CALLGRAF Text
bra.s ContPatch
SkipDraw:
move.l Win,a0
moveq #32,d0
move.l d1,a1
lea String,a2
LoopSWT:
move.b (a1),(a2)+
tst.b (a1)+
beq.s TheEndSWT
subq.l #1,d0
bne.s LoopSWT
move.b #0,(a2)+
TheEndSWT:
lea String,a1
move.l #0,a2
CALLINT SetWindowTitles
ContPatch:
movem.l (a7)+,a6/d1-d5
move.l DosNum,d0
LabelJmp:
jmp $00000000
;*** String length ***
;a0 = string address
;-> d0 = length
;***
StrLen:
moveq #-1,d0
LoopSL:
addq.l #1,d0
tst.b (a0)+
bne.s LoopSL
rts
EVEN
DosBase: dc.l 0
IntBase: dc.l 0
GfxBase: dc.l 0
;Old SetFunction address
SaveSetF: dc.w 0
dc.l 0
rp: dc.l 0 ;RastPort
Win: dc.l 0 ;Window
UserPort: dc.l 0 ;Window user port
OutputHandle: dc.l 0
Offset: dc.l 0 ;Offset of function
WinTitle: dc.l 0 ;Current window title
DosNum: dc.l 0 ;Number for dos.library (intern)
ComLin: dc.l 0 ;Address of arguments to this command
ComLinLen: dc.l 0 ;Length of argumentstring
SmallWin: dc.b 0 ;1 if a small window is required
String: ds.b 35 ;Space for windowtitle
;Library names
DosLib: dc.b "dos.library",0
IntLib: dc.b "intuition.library",0
GfxLib: dc.b "graphics.library",0
WoTitle: dc.b "Open trace",0
WlTitle: dc.b "LoadSeg trace",0
UsageString: dc.b "Usage: Trace o | l [s]",10,0
UsageStringLen equ *-UsageString
EVEN
;Window
NWin:
dc.w 0,0,300,58
dc.b 2,1
dc.l CLOSEWINDOW+MOUSEBUTTONS
dc.l WINDOWDEPTH+WINDOWDRAG+WINDOWCLOSE+RMBTRAP+REPORTMOUSE
dc.l 0
dc.l 0
dc.l 0
dc.l 0,0
dc.w 0,0,0,0
dc.w CUSTOMSCREEN
END